from Crypto.Cipher import AES#导入AES加密模快,对称加密
from Crypto import Random
from binascii import b2a_hex
import rsa#导入RSA加密模快,非对称加密
import binascii as b
#linux下安装
#pip install pycryptodome
#import Crypto
#windows下安装
#pip install pycryptodomex
#import Cryptodome


global r_pube_key#rsa的公钥
global r_pubc_key#rsa的私钥
global a_pub_key#AES的私钥
(r_pe_key,r_pc_key) = rsa.newkeys(256)#RSA生成新的公钥r_pe_key,私钥r_pc_key
r_pube_key = r_pe_key
r_pubc_key = r_pc_key
#print('RSA公钥:{}\nRSA秘钥:{}\n类型{}{}:'.format(r_pube_key,r_pubc_key,type(r_pube_key),type(r_pubc_key)))
a_pub_key = b'asirlsjsoenxpesk'#AES秘钥长度16字节(128位),24b(192位),32b(256位)

def encpt(self):
	#AES对称式加密(加密的明文长度必须为16的倍数,不足需要补足)
	
	iv = Random.new().read(AES.block_size)#生成秘钥向量
	data = AES.new(a_pub_key,AES.MODE_CFB,iv)#初始化AES对象,使用MODE_CFB模式
	pe_data = data.encrypt(self.encode())#加密明文
	#pe_data = b.b2a_hex(pe_data)
	#print('AES的秘钥:{}'.format(iv))
	
	#RSA非对称式加密
	#RSA公钥有两个值n和e,n通常为长度256字节的16进制字符串,e通常为16进制的'10001'
	'''
	pubkey_n = generate(256)#获取长度为256的16进制字符串
	pubkey_e = '10001'
	rsa_n = int(pubkey_n,16)#将16进制转为10进制
	rsa_e = int(pubkey_e,16)
	r_pc_key = rsa.PublicKey(rsa_n,rsa_e)#用n和e的值生成RSA公钥
	'''
	
	pub_pe = rsa.encrypt(iv,r_pube_key)#使用RSA把AES的秘钥加密
	#pub_pe = b.b2a_hex(pub_pe)#转化为常用的可读性高的16进制
	pub_data = pub_pe + pe_data#将使用rsa加密过的秘钥和aes加密的明文组成新的字符串
	print('加密的明文:{}\nrsa加密后的秘钥:{}\n位数:{}'.format(pe_data,pub_pe,len(pub_pe)))
	return pub_data #返回加密后的数据


def decpt(self):
	#print('要解密的数据:{}\n类型{}'.format(self,type(self)))
	r_pub = self[:32] #将被RSA加密的AES秘钥提取出来
	#print(r_pub)
	a_key = rsa.decrypt(r_pub,r_pubc_key)#使用RSA解密AES的秘钥
	#print('解密的的AES秘钥为:{}'.format(a_key))
	a_new_key = AES.new(a_pub_key,AES.MODE_CFB,a_key)#使用公钥和秘钥生成新的AES对象
	pc_data = a_new_key.decrypt(self[32:])#使用新的AES对象将密文解密为明文
	print('解密数据为:{}'.format(pc_data.decode()))
	return pc_data.decode()

s = '我的账号'
pe = encpt(s)
#print(len(pe),type(pe))
p = pe[:64]

#print(len(pe))
pc = decpt(pe)


'''
功能
a2b_base64（数据，/）
解码base64数据行。

A2B_Hex（十六进制，/）
十六进制表示的二进制数据。

hexstr必须包含偶数个十六进制数字（上限或下限ER病例）。
此函数也可用作“unexclify（）”。

a2b_hqx（数据，/）
解码。HQX编码。

a2b_qp（数据，头=假）
解码QP编码数据的字符串。

A2BYUU（数据，，）
解码一行UUCoded数据。

B2A_base64（数据，/）
base64数据行代码。

B2A_Hex（数据，/）
二进制数据的十六进制表示。

返回值是一个字节对象。此函数也是
可用作“hexlify（）”。

b2a_hqx（数据，/）
编码.hqx数据。

b2a_qp（数据，quotetabs=false，istext=true，header=false）
使用带引号的可打印编码对字符串进行编码。
在编码时，如果设置了istext，则不会对换行进行编码，并且白色行尾的空间是。未设置istext时，\r和\n（

CR/LF
都是编码的。设置QuoteTabs时，空格和制表符为e。编码的。
B2AYUU（数据，，）

UUCENCODE数据行。

CRC32（数据，CRC=0，/）
递增计算CRC-32。

crc_hqx（数据，crc，/）
递增计算HQX CRC。

十六进制（数据，/）
二进制数据的十六进制表示。

返回值是一个字节对象。

rlecode_hqx（数据，/）
二进制数据。
rledicode_hqx（数据，/）
解码十六进制RLE编码字符串。
非交联（hexstr，/）
十六进制表示的二进制数据。
hexstr必须包含偶数个十六进制数字（上限或下限
ER病例）。
'''














